"use strict";

import { app, protocol, BrowserWindow, ipcMain } from "electron";
import { createProtocol, installVueDevtools } from "vue-cli-plugin-electron-builder/lib";
import { autoUpdater } from "electron-updater";
// const autoUpdater = require('').autoUpdater

const isDevelopment = process.env.NODE_ENV !== "production";
const feedUrl = "http://13.124.109.186/update/";

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win: BrowserWindow | null;
let webContents: any;
// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([{ scheme: "app", privileges: { secure: true, standard: true } }]);

function createWindow() {
    // Create the browser window.
    win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true
        }
    });
    webContents = win.webContents;

    if (process.env.WEBPACK_DEV_SERVER_URL) {
        // Load the url of the dev server if in development mode
        win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string);
        if (!process.env.IS_TEST) {
            win.webContents.openDevTools();
        }
    } else {
        createProtocol("app");
        // Load the index.html when not in development
        win.loadURL("app://./index.html");
    }

    win.on("closed", () => {
        win = null;
    });
}

// 主进程监听渲染进程传来的信息
ipcMain.on("update", (e: any, arg: any) => {
    console.log("update");
    checkForUpdates();
});

// Quit when all windows are closed.
app.on("window-all-closed", () => {
    // On macOS it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform !== "darwin") {
        app.quit();
    }
});

app.on("activate", () => {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (win === null) {
        createWindow();
    }
});

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on("ready", async () => {
    if (isDevelopment && !process.env.IS_TEST) {
        // Install Vue Devtools
        try {
            await installVueDevtools();
        } catch (e) {
            console.error("Vue Devtools failed to install:", e.toString());
        }
    }
    createWindow();
});

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
    if (process.platform === "win32") {
        process.on("message", data => {
            if (data === "graceful-exit") {
                app.quit();
            }
        });
    } else {
        process.on("SIGTERM", () => {
            app.quit();
        });
    }
}

let checkForUpdates = () => {
    // 配置安装包远端服务器
    autoUpdater.setFeedURL(feedUrl);
    // 下面是自动更新的整个生命周期所发生的事件
    autoUpdater.on("error", function(message) {
        sendUpdateMessage("error", message);
    });
    autoUpdater.on("checking-for-update", function(message) {
        sendUpdateMessage("checking-for-update", message);
    });
    autoUpdater.on("update-available", function(message) {
        sendUpdateMessage("update-available", message);
    });
    autoUpdater.on("update-not-available", function(message) {
        sendUpdateMessage("update-not-available", message);
    });

    // 更新下载进度事件
    autoUpdater.on("download-progress", function(progressObj) {
        sendUpdateMessage("downloadProgress", progressObj);
    });
    // 更新下载完成事件
    autoUpdater.on("update-downloaded", function(event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
        sendUpdateMessage("isUpdateNow");
        ipcMain.on("updateNow", (e: any, arg: any) => {
            autoUpdater.quitAndInstall();
        });
    });
    //执行自动更新检查
    autoUpdater.checkForUpdates();
};

// 主进程主动发送消息给渲染进程函数
function sendUpdateMessage(message: any, data?: any) {
    console.log({ message, data });
    webContents.send("message", { message, data });
}
